package com.spring.framework.config.manage.service;

import com.spring.framework.config.manage.dao.AccountInfoDao;
import com.spring.framework.config.manage.dao.ProductInfoDao;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;

@Component
@SuppressWarnings("all")
public class PayServiceImpl implements PayService {

    @Autowired
    private AccountInfoDao accountInfoDao;

    @Autowired
    private ProductInfoDao productInfoDao;

    @Override
	@Transactional(rollbackFor = Exception.class)
	public void pay(String accountId, double money) {
        //查询余额
        double blance = accountInfoDao.qryBlanceByUserId(accountId);

        //余额不足正常逻辑
        if(new BigDecimal(blance).compareTo(new BigDecimal(money))<0) {
            throw new RuntimeException("余额不足");
        }

        //更新余额
         int retVal = accountInfoDao.updateAccountBlance(accountId,money);
        // 库存-1,由于动态代理原因，本类中调用包含事务的方法，不会被事务管理管理，因为事务是基于 jdk 动态代理，
		// jdk 动态代理无法做到代理方法中调用其它代理方法，拥有同样的代理效果。cglib 则可以嵌套调用代理方法。
		// jdk -> A 调用 B,B 执行的是未代理的方法
		// cglib -> A 调用 B,B 执行的是代理后的方法
		// 因此使用事务管理的时候，把事务方法写在不同的类上，便于事务管理。
        //updateProductStore(1);
        ((PayService)AopContext.currentProxy()).updateProductStore(1);

        // System.out.println(1/0);
        System.out.println("");

    }

    @Override
	@Transactional(propagation = Propagation.NESTED)
	// @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void updateProductStore(Integer productId) {
        try{
            productInfoDao.updateProductInfo(productId);

        }
        catch (Exception e) {
            throw new RuntimeException("内部异常");
        }
    }


}
